#pragma once

#include <vector>
#include <string>
#include <utility>
#include <iostream>

#include "good_vector.h"

class big_int
{
private:
   good_vector digits;
   static const int BASE = 1000000000;
   static const int BASE_LENGTH = 9;
   bool sign;
   int shift;

public:
   big_int();
   big_int(int a);
   explicit big_int(const std::string sa);
   int compare_to(const big_int& b) const;
   size_t length() const;
   void swap(big_int&);

private:
   big_int(const good_vector&, bool);
   int find_divisor(const big_int& b);
   void delete_zeros();

public:
    
    big_int& operator +=(const big_int&);
    big_int& operator -=(const big_int&);
    big_int& operator *=(const big_int&);
    big_int& operator /=(const big_int&);
    big_int& operator %=(const big_int&);
    big_int& operator <<=(size_t);
    big_int& operator >>=(size_t);
    big_int operator -() const;
    
    friend big_int abs(big_int);
    friend std::istream& operator >>(std::istream&, big_int&);
    friend std::ostream& operator <<(std::ostream&, const big_int&);


};

void swap(big_int& a, big_int& b);

bool operator ==(const big_int&, const big_int&);
bool operator !=(const big_int&, const big_int&);
bool operator <=(const big_int&, const big_int&);
bool operator <(const big_int&, const big_int&);
bool operator >=(const big_int&, const big_int&);
bool operator >(const big_int&, const big_int&);

big_int operator <<(const big_int&, size_t);
big_int operator >>(const big_int&, size_t);
big_int operator +(const big_int&, const big_int&);
big_int operator -(const big_int&, const big_int&);
big_int operator *(const big_int&, const big_int&);
big_int operator /(const big_int&, const big_int&);
big_int operator %(const big_int&, const big_int&);